# -*- coding: utf-8 -*-

import numpy as np


def np_random():
    # 正态分布
    a = np.random.rand(2, 3)
    print('a:----------\n', a, sep='')

    # 标准正态分布
    b = np.random.randn(2, 3)
    print('b:----------\n', b, sep='')
    print(np.random.standard_normal(size=(2, 3)))

    # 离散均匀分布
    c = np.random.randint(0, 6, size=(2, 3))
    print('c:----------\n', c, sep='')

    # 连续均匀分布
    d = np.random.random(size=(2, 3))
    print('d:----------\n', d, sep='')
    print(np.random.sample(size=(2, 3)))
    print(np.random.random_sample(size=(2, 3)))

    # 二项分布
    e = np.random.binomial(10, 0.5, size=(2, 3))
    print('e:----------\n', e, sep='')

    pass


def np_linalg():
    A = np.array([[1, 3], [2, 4]])
    print('A:----------\n', A, sep='')

    # 逆矩阵:AB=BA=E => B=A_{-1},A=B_{-1}
    B = np.linalg.inv(A)
    print('B:----------\n', B, sep='')
    # 单位矩阵
    E = np.eye(2)
    print('E:----------\n', E, sep='')
    # print(A.dot(B))
    # print(B.dot(A))

    # 矩阵的Moore-Penrose伪逆
    C = np.linalg.pinv(A)
    print('C:----------\n', C, sep='')

    # QR分解:正交三角分解:Ax=b => QRx=b => Rx=Q.T.dot(b)
    Q, R = np.linalg.qr(A)
    print('Q:----------\n', Q, sep='')
    print('R:----------\n', R, sep='')

    # 特征分解:A=V.T.dot(D).dot(V)
    # 特征值和特征向量
    D, V = np.linalg.eig(A)
    print('D:----------\n', D, sep='')
    print('V:----------\n', V, sep='')

    # SVD(Singular Value Decomposition):奇异值分解
    S, V, D = np.linalg.svd(A)
    print('S:----------\n', S, sep='')
    print('V:----------\n', V, sep='')
    print('D:----------\n', D, sep='')

    # 最小二乘解
    # print(np.linalg.lstsq(A, E))

    pass


if __name__ == '__main__':
    pass
